package com.atguigu.gmall.list.consumer;

import com.atguigu.gmall.list.service.ListService;
import com.atguigu.gmall.mq.config.MqConst;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author ：MJS
 * @date ：Created in 2021/5/26  22:59
 * @description：监听MQ的消息
 *
 */

@Component
@SuppressWarnings("all")
public class ListConsumer {
    //1、配置式
    //2、注解式
    @Autowired
    private ListService listService;
   //上架接收消息
    @RabbitListener(bindings ={@QueueBinding(
            value = @Queue(value = MqConst.QUEUE_GOODS_UPPER,durable ="true",autoDelete = "false"),
            exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_GOODS),
            key = {MqConst.ROUTING_GOODS_UPPER}
    )})
    public void onSaleMessage(Long skuId, Message message, Channel channel){
        try {
            System.out.println("skuId:" + skuId);
            //导入数据
            listService.onSale(skuId);
            //应答成功接收消息
            //long deliveryTag : 消息的标识
            //multiple的true  批量应答 和false 只应答当前
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            //e.printStackTrace();
            //当前此消息是否为再投递的消息
            if(message.getMessageProperties().isRedelivered()){
                //第二次  再投递的消息
                System.out.println("当前消息是第二次投递");
                //参数2：是否放回队列 （给一次重新发送的机会）
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                    //记录日志  人为干扰
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }else{
                //第一次
                System.out.println("当前消息是第一次投递");
                try {
                    //否定确认
                    //long deliveryTag : 消息的标识
                    //multiple的true  批量应答 和false 只应答当前
                    //参数3：是否放回队列 （给一次重新发送的机会）
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),
                            false,true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
    //下架接收消息
    @RabbitListener(bindings = {@QueueBinding(
            value = @Queue(value = MqConst.QUEUE_GOODS_LOWER,durable = "true",autoDelete = "false"),
            exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_GOODS),
            key = {MqConst.ROUTING_GOODS_LOWER}
    )})
    public void cancelSaleMessage(Long skuId, Message message, Channel channel){
        try {
            System.out.println("skuId:" + skuId);
            //删除索引
            listService.cancelSale(skuId);
            //应答成功接收消息
            //long deliveryTag : 消息的标识
            //multiple的true  批量应答 和false 只应答当前
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            //e.printStackTrace();
            //当前此消息是否为再投递的消息
            if(message.getMessageProperties().isRedelivered()){
                //第二次  再投递的消息
                System.out.println("当前消息是第二次投递");
                //参数2：是否放回队列 （给一次重新发送的机会）
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                    //记录日志  人为干扰
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }else{
                //第一次
                System.out.println("当前消息是第一次投递");
                try {
                    //否定确认
                    //long deliveryTag : 消息的标识
                    //multiple的true  批量应答 和false 只应答当前
                    //参数3：是否放回队列 （给一次重新发送的机会）
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),
                            false,true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}
